home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok16
/
memsystem
/
taskmemory.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
4KB
|
137 lines
(**********************************************************************
:Program. TaskMemory.mod
:Contents. Allocation procedures using the Task.memEntry-list
:Author. Nicolas Benezan [bne]
:Address. Postwiesenstr. 2, D7000 Stuttgart 60
:Phone. 711/333679
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft 3.2d
:History. V1.0b [bne] 27.Jan.1989 (extracted from MemSystem1.1)
:History. V1.1a [bne] 29.Mar.1989 (supports MemSystem1.3, Levels)
:Bugs. does not handle Arts-levels perfectly if CLI-started
:Bugs. (however, no serious malfunctions should occur)
**********************************************************************)
IMPLEMENTATION MODULE TaskMemory;
FROM SYSTEM IMPORT ADR, ADDRESS, CAST;
FROM Exec IMPORT MemReqSet, MemReqs, TaskPtr, FindTask, NodePtr,
AddHead, Remove, AllocEntry, FreeEntry, MemList, MemEntry,
MemListPtr, Byte;
FROM Arts IMPORT TermProcedure, wbStarted, CurrentLevel;
CONST ThisTask=NIL;
NodeName="TaskMemEntry";
TYPE TaskMemEntry=RECORD
memList:MemList;
memEntry:MemEntry;
END;
TaskMemEntryPtr=POINTER TO TaskMemEntry;
PROCEDURE AllocTaskMem(byteSize:LONGINT;requirements:MemReqSet):ADDRESS;
VAR Task:TaskPtr;
Entry:TaskMemEntry;
EntryPtr:TaskMemEntryPtr;
BEGIN
WITH Entry DO
memList.numEntries:=1;
memEntry.reqs:=requirements;
memEntry.length:=byteSize;
END;
EntryPtr:=ADDRESS(AllocEntry(ADR(Entry)));
IF LONGINT(EntryPtr)<0 THEN
RETURN NIL;
ELSE
Task:=FindTask(ThisTask);
WITH EntryPtr^.memList.node DO
name:=ADR(NodeName);
pri:=CAST(Byte,Task^.memEntry.pad);
END;
AddHead(ADR(Task^.memEntry),ADDRESS(EntryPtr));
RETURN EntryPtr^.memEntry.addr;
END;
END AllocTaskMem;
PROCEDURE DeallocTaskMem(VAR Pointer:ADDRESS);
VAR Task:TaskPtr;
EntryPtr:TaskMemEntryPtr;
BEGIN
Task:=FindTask(ThisTask);
EntryPtr:=ADDRESS(Task^.memEntry.head);
LOOP
IF EntryPtr^.memList.node.succ#NIL THEN
IF EntryPtr^.memEntry.addr=Pointer THEN
(* this assumes that the MemEntry-list is not corrupt !!! *)
(* otherwise guru is likely to occur *)
Remove(ADDRESS(EntryPtr));
FreeEntry(ADDRESS(EntryPtr));
Pointer:=NIL;
EXIT
END;
EntryPtr:=ADDRESS(EntryPtr^.memList.node.succ);
ELSE
EXIT
END;
END;
END DeallocTaskMem;
(**)
(* The following procedures are included to be compatible with Heap *)
(**)
PROCEDURE AllocMem(VAR adr:ADDRESS;size:LONGINT;chipMem:BOOLEAN);
BEGIN
IF chipMem THEN
adr:=AllocTaskMem(size,CHIP);
ELSE
adr:=AllocTaskMem(size,ANY);
END;
END AllocMem;
PROCEDURE Allocate(VAR adr:ADDRESS;size:LONGINT);
BEGIN
adr:=AllocTaskMem(size,ANY);
END Allocate;
PROCEDURE Deallocate(VAR adr:ADDRESS);
BEGIN
DeallocTaskMem(adr);(* tell me why m2cV3.11 can't alias *)
END Deallocate;
(**)
(* Free the entries we added to the memEntry-list of a CLI *)
(* (because the CLI-Task is not RemTask()ed when we exit) *)
(**)
PROCEDURE CleanupCliHeap;
VAR Task:TaskPtr;
EntryPtr,NextEntryPtr:TaskMemEntryPtr;
BEGIN
IF CurrentLevel()<=0 THEN
Task:=FindTask(ThisTask);
EntryPtr:=ADDRESS(Task^.memEntry.head);
LOOP
NextEntryPtr:=ADDRESS(EntryPtr^.memList.node.succ);
IF NextEntryPtr=NIL THEN
EXIT
END;
IF EntryPtr^.memList.node.name=ADR(NodeName) THEN
(* if it is ours *)
Remove(ADDRESS(EntryPtr));
FreeEntry(ADDRESS(EntryPtr));
END;
EntryPtr:=NextEntryPtr;
END;
END;
END CleanupCliHeap;
BEGIN
IF NOT wbStarted THEN
TermProcedure(CleanupCliHeap);
END;
END TaskMemory.